﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioCargo
    {
        private IRepositorioCargo _repositorioCargo;

        /// <summary>
        /// 
        /// </summary>
        public NegocioCargo()
        {
            _repositorioCargo = new RepositorioCargo();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="usuarioPermissao"></param>
        /// <param name="cargo"></param>
        /// <returns></returns>
        public Cargo Inserir(Usuario usuarioPermissao, Cargo cargo)
        {
            if(string.IsNullOrEmpty(cargo.Codigo))
            {
                cargo.Codigo = GeradorCodigo.GerarCodigo(1);
                cargo.Codigo += (_repositorioCargo.ObterUltimoIdCodigoInteiro() + 1).ToString();
                cargo.Codigo += GeradorCodigo.GerarCodigo(1, cargo.Codigo);    
            }
            
            return _repositorioCargo.Inserir(cargo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cargo"></param>
        /// <returns></returns>
        public Cargo Atualizar(Cargo cargo)
        {
            return _repositorioCargo.Atualizar(cargo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cargo"></param>
        public void Excluir(Cargo cargo)
        {
            Cargo cargoTmp = ObterPorId(cargo.CargoId);
            _repositorioCargo.Excluir(cargoTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<Cargo> ObterTodos()
        {
            return _repositorioCargo.ObterTodos();
        }

        public IList<Cargo> ObterTodosCargos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string codigo,
           string cboCodigo, string cboDescricao, string descricao, decimal previsaoSalarialDe, decimal previsaoSalarialAte, decimal salarioAnteriorDe,
           decimal salarioAnteriorAte, decimal percentualUltimoReajusteDe, decimal percentualUltimoReajusteAte,
           DateTime? ultimoReajusteDe, DateTime? ultimoReajusteAte, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte,
            DateTime? fimVigenciaDe, DateTime? fimVigenciaAte)
        {

            if (previsaoSalarialAte == 0)
            {
                previsaoSalarialAte = previsaoSalarialDe;
            }

            if (salarioAnteriorAte == 0)
            {
                salarioAnteriorAte = salarioAnteriorDe;
            }

            if (percentualUltimoReajusteAte == 0)
            {
                percentualUltimoReajusteAte = percentualUltimoReajusteDe;
            }

            if (!ultimoReajusteAte.HasValue)
            {
                ultimoReajusteAte = ultimoReajusteDe;
            }

            if (!inicioVigenciaAte.HasValue)
            {
                inicioVigenciaAte = inicioVigenciaDe;
            }

            if (!fimVigenciaAte.HasValue)
            {
                fimVigenciaAte = fimVigenciaDe;
            }

            return _repositorioCargo.ObterTodos(inicio, quantidade, quantidadeMinima, codigo, cboCodigo, cboDescricao,
                descricao, previsaoSalarialDe, previsaoSalarialAte, salarioAnteriorDe, salarioAnteriorAte, percentualUltimoReajusteDe,
                percentualUltimoReajusteAte, ultimoReajusteDe, ultimoReajusteAte, inicioVigenciaDe, inicioVigenciaAte,
                fimVigenciaDe, fimVigenciaAte);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Cargo ObterPorId(int id)
        {
            return _repositorioCargo.ObterPorId(id);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="descricao"></param>
        /// <returns></returns>
        public IList<Cargo> ObterPorDescricao(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            return _repositorioCargo.ObterPorDescricao(inicio, quantidade, quantidadeMinima,descricao);
        }
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cbo"></param>
        /// <returns></returns>
        public IList<Cargo> ObterPorDescricaoCbo(string descricaoCbo)
        {
            return _repositorioCargo.ObterPorDescricaoCbo(descricaoCbo);
        }

        public IList<Cargo> ObterPorCbo(int inicio, int quantidade, int quantidadeMinima, Cbo cbo)
        {
            return _repositorioCargo.ObterPorCbo(inicio, quantidade, quantidadeMinima,cbo);
        }

        public Cargo ObterCargoPorCodigo(Usuario usuarioPermissao, string codigo)
        {
            return _repositorioCargo.ObterPorCodigo(codigo);
        }


    }
}